import sympy as sy
import numpy as np
import matplotlib.pyplot as plt

#derivada
x = sy.Symbol('x')
fx = 0.025 * (x - 2)**2
dfx = sy.diff(fx, x)

print("f(x) =", fx)
print("f'(x) =", dfx)


def func_fx(x):
    if x < 2.0:
        return 0.025 * (x - 2)**2
    else:
        return 0.0
    
    
def func_dfx(x):
    if x < 2.0:
        return 0.05 * (x - 2) #derivada fx
    else:
        return 0.0

def aceleracao(x,g):
    return -g * func_dfx(x)

def simulacao_euler_cromer(aceleracao_func, x0, v0, x_lim, dt):
    x = x0
    v = v0
    t = 0.0

    x_vals = [x]
    v_vals = [v]
    t_vals = [t]

    while x < x_lim:
        a = aceleracao_func(x,g)
        v += a * dt
        x += v * dt
        t += dt
        x_vals.append(x)
        v_vals.append(v)
        t_vals.append(t)

    return np.array(t_vals), np.array(x_vals), np.array(v_vals)


# Calcule a potencial, 𝐸𝑝, inicial e daí a energia cinética final, 𝐸𝑐
def energia_para_velocidade(y, g, m):
    Ep = m * g * y
    return np.sqrt(2 * Ep / m)



g = 9.81  # aceleração da gravidade (m/s²)
m = 1.0   # massa (kg)
dt = 0.001  # passo de tempo (s)
x_max = 2.5  # posição limite para a simulação (m)
x0 = 0.0  # posição inicial (m)
v0 = 0.0  # velocidade inicial (m/s)



# Velocidade teórica via energia (altura inicial: 0.1 m)
v_teorica = energia_para_velocidade(y=0.1, g=g, m=m)

#velocidade simulada
t, x, vf = simulacao_euler_cromer(aceleracao, x0, v0, x_max, dt)


print(f"Velocidade final em x=2.5m: {vf[-1]:.2f} m/s")
print(f"Tempo: {t[-1]:.2f} s")

plt.plot(t, vf, label='Velocidade simulada')
plt.axhline(v_teorica, color='r', linestyle='--', label='Velocidade teórica')
plt.title("Exercício 1 – Pista Linear")
plt.xlabel("Tempo (s)")
plt.ylabel("Velocidade (m/s)")
plt.grid(True)
plt.legend()
plt.show()